bitkeeper revision 1.1159.212.67 (42001d370Zk3jsfUjyC3iV9vgEJAlA)
authoriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>
Wed, 2 Feb 2005 00:22:15 +0000 (00:22 +0000)
committeriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>
Wed, 2 Feb 2005 00:22:15 +0000 (00:22 +0000)
Create the e820 map dynamically. This makes it easy to run VMX guests
of different memory sizes (no need to manually edit the e820 map).

Signed-off-by: Xin B Li <xin.b.li@intel.com>
Signed-off-by: Arun Sharma <arun.sharma@intel.com>
Signed-off-by: ian.pratt@cl.cam.ac.uk
tools/libxc/linux_boot_params.h
tools/libxc/xc_vmx_build.c

index 749a41f63018e2af1112aecc9a023c8408b8a687..9b0b25cef991da73944ecd09f821419d0ae298fe 100644 (file)
@@ -15,6 +15,8 @@ struct mem_map {
 #define E820_RESERVED   2
 #define E820_ACPI       3 /* usable as RAM once ACPI tables have been read */
 #define E820_NVS        4
+#define E820_IO         16
+#define E820_SHARED     17
 
         unsigned long caching_attr;    /* used by hypervisor */
 #define MEMMAP_UC      0
index 7623b2b4483a21a6b555d2e239184e05bb7c23d0..aaae52f0c5ba2b0c656a55d3d2603c7695748d04 100644 (file)
@@ -46,6 +46,68 @@ loadelfsymtab(
     char *elfbase, int xch, u32 dom, unsigned long *parray,
     struct domain_setup_info *dsi);
 
+static void build_e820map(struct mem_map *mem_mapp, unsigned long mem_size)
+{
+    int nr_map = 0;
+
+    /* XXX: Doesn't work for > 4GB yet */
+    mem_mapp->map[0].addr = 0x0;
+    mem_mapp->map[0].size = 0x9F800;
+    mem_mapp->map[0].type = E820_RAM;
+    mem_mapp->map[0].caching_attr = MEMMAP_WB;
+    nr_map++;
+
+    mem_mapp->map[1].addr = 0x9F800;
+    mem_mapp->map[1].size = 0x800;
+    mem_mapp->map[1].type = E820_RESERVED;
+    mem_mapp->map[1].caching_attr = MEMMAP_UC;
+    nr_map++;
+
+    mem_mapp->map[2].addr = 0xA0000;
+    mem_mapp->map[2].size = 0x20000;
+    mem_mapp->map[2].type = E820_IO;
+    mem_mapp->map[2].caching_attr = MEMMAP_UC;
+    nr_map++;
+
+    mem_mapp->map[3].addr = 0xF0000;
+    mem_mapp->map[3].size = 0x10000;
+    mem_mapp->map[3].type = E820_RESERVED;
+    mem_mapp->map[3].caching_attr = MEMMAP_UC;
+    nr_map++;
+
+    mem_mapp->map[4].addr = 0x100000;
+    mem_mapp->map[4].size = mem_size - 0x100000 - PAGE_SIZE;
+    mem_mapp->map[4].type = E820_RAM;
+    mem_mapp->map[4].caching_attr = MEMMAP_WB;
+    nr_map++;
+
+    mem_mapp->map[5].addr = mem_size - PAGE_SIZE;
+    mem_mapp->map[5].size = PAGE_SIZE;
+    mem_mapp->map[5].type = E820_SHARED;
+    mem_mapp->map[5].caching_attr = MEMMAP_WB;
+    nr_map++;
+
+    mem_mapp->map[6].addr = mem_size;
+    mem_mapp->map[6].size = 0x3 * PAGE_SIZE;
+    mem_mapp->map[6].type = E820_NVS;
+    mem_mapp->map[6].caching_attr = MEMMAP_UC;
+    nr_map++;
+
+    mem_mapp->map[7].addr = mem_size + 0x3 * PAGE_SIZE;
+    mem_mapp->map[7].size = 0xA * PAGE_SIZE;
+    mem_mapp->map[7].type = E820_ACPI;
+    mem_mapp->map[7].caching_attr = MEMMAP_WB;
+    nr_map++;
+
+    mem_mapp->map[8].addr = 0xFEC00000;
+    mem_mapp->map[8].size = 0x1400000;
+    mem_mapp->map[8].type = E820_IO;
+    mem_mapp->map[8].caching_attr = MEMMAP_UC;
+    nr_map++;
+
+    mem_mapp->nr_map = nr_map;
+}
+
 static int setup_guestos(int xc_handle,
                          u32 dom, int memsize,
                          char *image, unsigned long image_size,
@@ -115,6 +177,7 @@ static int setup_guestos(int xc_handle,
     vboot_gdt_start    = vboot_params_end;
     vboot_gdt_end      = vboot_gdt_start + PAGE_SIZE;
 
+    /* memsize is in megabytes */
     v_end              = memsize << 20;
     vinitrd_end        = v_end - PAGE_SIZE; /* leaving the top 4k untouched for IO requests page use */
     vinitrd_start      = vinitrd_end - initrd_len;
@@ -290,6 +353,8 @@ static int setup_guestos(int xc_handle,
     boot_paramsp->drive_info.dummy[2] = 4;
     boot_paramsp->drive_info.dummy[14] = 32;
 
+    /* memsize is in megabytes */
+    build_e820map(mem_mapp, memsize << 20);
     boot_paramsp->e820_map_nr = mem_mapp->nr_map;
     for (i=0; i<mem_mapp->nr_map; i++) {
         boot_paramsp->e820_map[i].addr = mem_mapp->map[i].addr;